import java.util.Arrays;

public class ArrayList {

    //1.首先要创建成员变量 数组 和 数组元素的长度 这里为了使用方便，使用public
    public int array[];
    public int userSize;

    //2.有了成员变量之后  再通过构造函数对数组进行初始化 初始化的数组元素全为0
    public ArrayList(){
        this.array = new int[5];
    }

    //3.接下来的就是插入元素了  插入元素我们需要知道在下标的哪个位置插入，插入的元素值为多少
    public boolean isFull(){
        //3.1 判断数组是否满了 如果元素个数和数组长度相等则返回true,否则返回false
        if(this.userSize == this.array.length){
            return true;
        }else{
            return false;
        }
    }
    public void add(int pos,int value){
        //3.1 在插入元素之前，首先需要判断插入的位置是否合法  不合法的那就是下标小于0的或者是下标大于当前元素个数的两种情况
        if(pos<0 || pos>this.userSize){
            System.out.println("你输入的位置不合法");
            return;
        }else{
            //输入的位置没有错误的请款下再进行下面的判断
            // 需要判断数组是否满了，通过userSize和数组length是否相等来判断，所以add函数内部还应该内嵌一个判断函数
            if(isFull()){
                //如果满了需要借助数组拷贝函数ArraysOf来扩充数组长度
                this.array = Arrays.copyOf(this.array,2*this.array.length);
            }
            //接下来需要考虑如果需要移动元素的情况 这里的移动元素，是保持现有元素总数不变的情况下，占有式覆盖
            for (int i = this.userSize-1; i >= pos; i--) {
                this.array[i]=this.array[i-1];
            }
            this.array[pos]=value;
            this.userSize++;
            return;
        }
    }

    //4.打印线性表  插入有元素之后打印出来看看
    public void display(){
        for (int i = 0; i < this.userSize; i++) {
            System.out.print(array[i]+" ");
        }
    }

    //5.判断是否包含某个元素
    public boolean contains(int goal){
        for (int i = 0; i < this.userSize-1; i++) {
            if(this.array[i] == goal){
                return true;
            }
        }
        return false;
    }

    //6.获取pos位置  元素的值
    public int getPos(int pos){
        if(pos<0 || pos>this.userSize-1){
            System.out.println("pos位置不合法");
            return -1;
        }
        return this.array[pos];
    }
    //7.根据元素的值  获取该元素的下标

    public int search(int toFind) {
        for (int i = 0; i < this.userSize; i++) {
            if(this.array[i]==toFind){
                return i;
            }
        }
        return -1;
    }


    //本节的第二个难点，删除第一次出现的关键字key
    public void remove(int key){
        //1.找到要删除的关键字的位置记为index
        //借助已经写好的函数获取index
        int index=this.search(key);
        if(index==-1){
            System.out.println("没有这个关键字");
            return;
        }
        //循环[i]=[i+1] 判断
        //usedSize--
        /*重点注意循环是到unsedSize-1  因为循环到usedSize的时候数组会越界*/
        for (int i = index; i < this.userSize-1; i++) {
            this.array[i]=this.array[i+1];
        }
        this.userSize--;
        return;
    }

    // 获取顺序表长度
    public int size() {
        return this.userSize;
    }
    // 清空顺序表
    public void clear() {

        this.userSize=0;
    }
    






}
